﻿using System;
using System.Collections.Generic;
using System.Xml;
using System.Net;
using System.IO;
using Microsoft.SharePoint;
using System.Globalization;
using VPLink2013.Framework;

namespace VPLink2013.Batch
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "http://vente-privee-coll.profils.org/handlers/offerxml.ashx";
            HttpWebResponse response = null;
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                CookieContainer cc = new CookieContainer();
                request.CookieContainer = cc;
                request.Proxy = WebRequest.DefaultWebProxy;
                request.Credentials = System.Net.CredentialCache.DefaultCredentials; ;
                request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (Exception e)
            {
                Console.Write("Exception...");
                ContextTrace.AddTrace(string.Format("Exception lors de la connexion : {0}", e.Message));
                ContextTrace.AddTrace(e.StackTrace);
            }
            XmlDocument xmldoc = new XmlDocument();
            string xmlString = string.Empty;
            using (StreamReader sr = new StreamReader(response.GetResponseStream()))
            {
                xmlString = sr.ReadToEnd();
                sr.Close();
            }
            xmldoc.LoadXml(xmlString);
            XmlNodeList topM = xmldoc.DocumentElement.ChildNodes;
            List<OffreInterne> offres = new List<OffreInterne>();
            Console.WriteLine("XML chargé...");
            foreach (XmlNode element in topM)
            {
                var allchilds = element.ChildNodes;

                var detailsDesription = allchilds.Item(11).ChildNodes;
                //contrat                
                string contrat = detailsDesription.Item(6).InnerText;
                string contrat2 = detailsDesription.Item(7).InnerText;
                if (contrat.CompareTo("CDI") == 0)
                {
                    OffreInterne offre = new OffreInterne();

                    offre.ID = Convert.ToInt32(allchilds.Item(0).InnerText);
                    offre.Url = "https://vente-privee.talent-soft.com/LoginPage.aspx";//allchilds.Item(9).InnerText;
                    offre.Reference = allchilds.Item(1).InnerText;
                    offre.Mission = detailsDesription.Item(1).InnerText;
                    var detailsLocation = detailsDesription.Item(11).ChildNodes;
                    if (detailsLocation.Item(2).ChildNodes.Count > 0)
                        offre.Pays = detailsLocation.Item(2).ChildNodes[0].InnerText;
                    if (detailsLocation.Item(3).ChildNodes.Count > 0)
                        offre.Region = detailsLocation.Item(3).ChildNodes[0].InnerText;
                    if (detailsLocation.Item(4).ChildNodes.Count > 0)
                        offre.Departement = detailsLocation.Item(4).ChildNodes[0].InnerText;
                    offre.Localisation = detailsLocation.Item(0).InnerText;
                    offre.Profil = detailsDesription.Item(2).InnerText;
                    offre.TitreExterne = detailsDesription.Item(3).InnerText;
                    offre.TitreInterne = ConversionTitre(offre.TitreExterne);
                    offre.DateCreation = DateTime.ParseExact(allchilds.Item(6).InnerText,
                                        "yyyyMMdd",
                                        CultureInfo.InvariantCulture,
                                        DateTimeStyles.None);
                    offre.Metier = detailsDesription.Item(8).InnerText;
                    offres.Add(offre);
                }
                else if (contrat2.CompareTo("CDI") == 0)
                {
                    OffreInterne offre = new OffreInterne();

                    offre.ID = Convert.ToInt32(allchilds.Item(0).InnerText);
                    offre.Url = "https://vente-privee.talent-soft.com/LoginPage.aspx";
                    offre.Reference = allchilds.Item(1).InnerText;
                    offre.Mission = detailsDesription.Item(1).InnerText;
                    var detailsLocation = detailsDesription.Item(12).ChildNodes;
                    if (detailsLocation.Item(2).ChildNodes.Count > 0)
                        offre.Pays = detailsLocation.Item(2).ChildNodes[0].InnerText;
                    if (detailsLocation.Item(3).ChildNodes.Count > 0)
                        offre.Region = detailsLocation.Item(3).ChildNodes[0].InnerText;
                    if (detailsLocation.Item(4).ChildNodes.Count > 0)
                        offre.Departement = detailsLocation.Item(4).ChildNodes[0].InnerText;
                    offre.Localisation = detailsLocation.Item(0).InnerText;
                    offre.Profil = detailsDesription.Item(2).InnerText;
                    offre.TitreExterne = detailsDesription.Item(3).InnerText;
                    offre.TitreInterne = ConversionTitre(offre.TitreExterne);
                    offre.DateCreation = DateTime.ParseExact(allchilds.Item(6).InnerText,
                                        "yyyyMMdd",
                                        CultureInfo.InvariantCulture,
                                        DateTimeStyles.None);

                    offre.Metier = detailsDesription.Item(9).InnerText;
                    offres.Add(offre);
                }
            }
            Console.WriteLine("Nombre d'offres : " + offres.Count);
            ContextTrace.AddTrace(string.Format("Nombre d'offres : {0}", offres.Count));

            string strUrlSite = System.Configuration.ConfigurationManager.AppSettings["VPLink"];
            ManageSPListUpdates(offres, strUrlSite);
            ContextTrace.Save(@"I:\Install files\Evolutions\Batch\2014 05 09 Batch offres internes", "offresinternes_trace");
        }

        private static void ManageSPListUpdates(List<OffreInterne> offres, string strUrlSite)
        {
            SPSecurity.RunWithElevatedPrivileges
            (delegate()
            {
                using (SPSite site = new SPSite(strUrlSite))
                {
                    using (SPWeb web = site.OpenWeb())
                    {
                        web.AllowUnsafeUpdates = true;
                        string strNomListe = "Offres internes";
                        SPList lst = web.Lists[strNomListe];
                        SPListItemCollection items = lst.Items;

                        //desactive toutes les annonces de la liste
                        foreach (SPListItem item in items)
                        {
                            item["Active"] = "False";
                            item.Update();
                        }
                        lst.Update();
                        Console.WriteLine("Offres desactivees...");
                        //import
                        foreach (OffreInterne offre in offres)
                        {
                            SPQuery query = new SPQuery();
                            query.Query = @"<Where><Contains><FieldRef Name='Ref' /><Value Type='Text'>" + offre.Reference + "</Value></Contains></Where>";
                            try
                            {
                                SPListItemCollection found = lst.GetItems(query);

                                if (found.Count == 0)
                                {
                                    ContextTrace.AddTrace(string.Format("Ajout de l'offre : {0}", offre.Reference));
                                    AddNewJob(lst, offre);
                                }
                                else
                                {
                                    ContextTrace.AddTrace(string.Format("Offre  {0} existe déjà", offre.Reference));
                                    SPListItem offreActuelle = (SPListItem)found[0];
                                    offreActuelle["Active"] = "True";
                                    offreActuelle.Update();
                                }
                            }
                            catch (Exception err)
                            {
                                Console.Write("error: " + err);
                                ContextTrace.AddTrace(string.Format("Exception lors de l'ajout des jobs : {0}", err.Message));
                                ContextTrace.AddTrace(err.StackTrace);
                            }

                        }
                        lst.Update();
                        Console.WriteLine("Offres ajoutees...");

                        //suppression de toutes les offres non actives
                        SPQuery queryDelete = new SPQuery();
                        queryDelete.Query = @"<Where><Eq><FieldRef Name='Active' /><Value Type='Boolean'>0</Value></Eq></Where>";
                        SPListItemCollection anciennesOffres = lst.GetItems(queryDelete);
                        for (int intIndex = anciennesOffres.Count - 1; intIndex > -1; intIndex--)
                        {
                            anciennesOffres.Delete(intIndex);
                        }
                        lst.Update();
                        Console.WriteLine("Suppression des anciennes offres...");
                        web.AllowUnsafeUpdates = false;
                    }
                }
            });
        }

        private static void AddNewJob(SPList lst, OffreInterne offre)
        {
            SPListItem nouvelleOffre = lst.Items.Add();
            nouvelleOffre["Ref"] = offre.Reference;
            nouvelleOffre["Date de création"] = offre.DateCreation;
            nouvelleOffre["Titre"] = offre.TitreExterne;
            nouvelleOffre["Titre Interne"] = offre.TitreInterne;
            nouvelleOffre["Url"] = offre.Url;
            nouvelleOffre["Métier"] = offre.Metier;
            nouvelleOffre["Temps de travail"] = offre.TpsTravail;
            nouvelleOffre["Mission"] = offre.Mission.Replace("vente-privee", "vente#privee").Replace("-", "<br/>-").Replace("-", "<br/>-").Replace("•", "<br/>•").Replace("vente#privee", "vente-privée");
            if (offre.Profil.Contains("-"))
            {
                nouvelleOffre["Profil"] = offre.Profil.Replace("vente-privee", "vente#privee").Replace("-", "<br/>-").Replace("•", "<br/>•").Replace("vente#privee", "vente-privée");
            }
            else
            {
                nouvelleOffre["Profil"] = offre.Profil.Replace("vente-privee", "vente#privee").Replace(".", ".<br/>").Replace("•", "<br/>•").Replace("vente#privee", "vente-privée");
            }

            nouvelleOffre["Localisation"] = offre.Localisation;
            nouvelleOffre["Pays"] = offre.Pays;
            nouvelleOffre["DépartementFR"] = offre.Departement;
            nouvelleOffre["Région"] = offre.Region;
            nouvelleOffre["Active"] = "True";
            nouvelleOffre.Update();
        }

        private static string ConversionTitre(string titreExterne)
        {
            string titreInterne = titreExterne;
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(@"titres.xml");
            XmlNodeList topM = xmldoc.DocumentElement.ChildNodes;
            string xmlExterne = "";
            foreach (XmlNode element in topM)
            {
                xmlExterne = element.ChildNodes.Item(0).InnerText;
                if (xmlExterne.CompareTo(titreExterne) == 0) titreInterne = element.ChildNodes.Item(1).InnerText;
            }
            return titreInterne;
        }


    }
}
